package com.vinisoft.gymwebapp.view;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
import com.vinisoft.gymwebapp.model.entities.GymMenu;
import com.vinisoft.gymwebapp.model.entities.GymUsuario;
import com.vinisoft.gymwebapp.model.facades.GymMenuFacade;
import com.vinisoft.gymwebapp.model.facades.GymUsuarioFacade;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.primefaces.model.menu.DefaultMenuItem;
import org.primefaces.model.menu.DefaultMenuModel;
import org.primefaces.model.menu.DefaultSubMenu;
import org.primefaces.model.menu.MenuElement;

/**
 *
 * @author root
 */
@Named("login")
@ViewScoped
public class LoginJSFManagedBean extends AbstractJSFManagedBean implements Serializable {

//
//    @ManagedProperty(value = "#{SessionBean}")
    @Inject
    private SessionJSFManagedBean sessionBean;
//
    @EJB
    private GymUsuarioFacade usuarioFacade;
    @EJB
    private GymMenuFacade menuFacade;
    //
    private String usuario;
    private String pass;
//

    @Override
    @PostConstruct
    protected void _init() {
        super._init();
    }

// ==============================================================================
    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }

// ==============================================================================
    public String iniciarSesion$action() {
        List<Object> objs = new ArrayList<>();
        sessionBean.setMenuBarModel(new DefaultMenuModel());
        sessionBean.getMenuBarModel().getElements().clear();
        try {
            HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
            request.login(usuario, pass);
            FacesContext.getCurrentInstance().getExternalContext().getSession(true);

            GymUsuario u = usuarioFacade.find(usuario);
            sessionBean.setUsuario(u);

            for (MenuElement me : generarMenu(menuFacade.findAllNivel0(u.getIdRol()), u)) {
                sessionBean.getMenuBarModel().addElement(me);
            }
            //Cias compania = companiafacade.find(empleado.getEmpleadosPK().getCodCia());
            //getSessionBean().setEmpleado(empleado);
            //getSessionBean().setCompania(compania);
//        getSessionBean().setRol(getSessionBean().getUsuario().getIdRol());
            sessionBean.setFechaHoraInicioSesion(GregorianCalendar.getInstance().getTime());
//        List<BigDecimal> listaIDMenus = menuFacade.findAllNivel0(getSessionBean().getRol());
//        List<Menu> listaMenus0 = new ArrayList<Menu>();
//        for (BigDecimal idMenu : listaIDMenus)
//            listaMenus0.add(menuFacade.find(idMenu));
//        List<UIComponent> listaMenusGenerados = generarMenu(listaMenus0, getSessionBean().getRol());
//        for (UIComponent objMenu : listaMenusGenerados)
//            getSessionBean().getMenuBarModel().getContents().add(objMenu);
            objs.add(usuario != null ? usuario : "[Ninguno]");
            objs.add(sessionBean.getFechaHoraInicioSesion());
            logger.log(Level.INFO, "[Inicio de sesion del usuario {0}: {1}]", objs.toArray(new Object[0]));
            return inicio$action();
        } catch (ServletException excpt) {
            mostrarMensajeJSF(FacesMessage.SEVERITY_ERROR, "No se permite el inicio de sesión: Nombre de usuario y/o contraseña incorrectos");
            excpt.printStackTrace(System.err);
            return null;
        }
    }

    public String cerrarSesion$action() {
        try {
            HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
            HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);

            List<Object> objs = new ArrayList<>();
            objs.add(FacesContext.getCurrentInstance().getExternalContext().getRemoteUser());
            objs.add(GregorianCalendar.getInstance().getTime());
            logger.log(Level.INFO, "[Cierre de sesion del usuario {0}: {1}]", objs.toArray(new Object[0]));

            request.logout();
            session.invalidate();

            return inicio$action();
        } catch (ServletException excpt) {
            mostrarMensajeJSF(FacesMessage.SEVERITY_ERROR, excpt.toString());
            excpt.printStackTrace(System.err);
            return null;
        }
    }
////////// =============================================================================
////////private List<UIComponent> generarMenu(List<Menu> menus0, Rol _rol)
////////{
////////    List<UIComponent> lo = new ArrayList<UIComponent>();
////////    if ((menus0 != null) && !menus0.isEmpty())
////////        {
////////        for (Menu menu : menus0)
////////            {
////////            List<BigDecimal> menusHijosObj = menuFacade.menusHijosPorRol(menu, _rol);
////////            List<Menu> menusHijos = new ArrayList<Menu>();
////////            for (BigDecimal codMenu : menusHijosObj)
////////                menusHijos.add(menuFacade.find(codMenu));
////////            if (/*(menusHijos == null) ||*/menusHijos.isEmpty()) // es un menuitem!
////////                {
////////                MenuItem menuItem = new MenuItem();
////////                menuItem.setValue(menu.getTitulo());
////////                menuItem.setUrl(menu.getDireccion());
////////                menuItem.setIcon(menu.getIcono());
////////                lo.add(menuItem);
////////                }
////////            else // es un submenu!
////////                {
////////                Submenu submenu = new Submenu();
////////                submenu.setLabel(menu.getTitulo());
////////                submenu.setIcon(menu.getIcono());
////////                for (UIComponent obj : generarMenu(menusHijos, _rol))
////////                    submenu.getChildren().add(obj);
////////                lo.add(submenu);
////////                }
////////            }
////////        }
////////    return lo;
////////}
    
    
     private List<MenuElement> generarMenu(List<GymMenu> menus0, GymUsuario usuario) {
        List<MenuElement> lo = new ArrayList<>();
        if ((menus0 != null) && !menus0.isEmpty()) {
            for (GymMenu menu : menus0) {
                List<Integer> menusHijosObj = menuFacade.menusHijosPorRol(menu, usuario.getIdRol());
                List<GymMenu> menusHijos = new ArrayList<>();
                for (Integer codMenu : menusHijosObj) {
                    menusHijos.add(menuFacade.find(codMenu));
                }
                if (menusHijos.isEmpty()) // es un menuitem!
                {
                    DefaultMenuItem menuItem = new DefaultMenuItem();
                    menuItem.setValue(menu.getTitulo());
                    menuItem.setUrl(menu.getDireccion());
                    menuItem.setIcon(menu.getIcono());
                    lo.add(menuItem);
                } else // es un submenu!
                {
                    DefaultSubMenu submenu = new DefaultSubMenu();
                    submenu.setLabel(menu.getTitulo());
                    submenu.setIcon(menu.getIcono());
                    for (MenuElement obj : generarMenu(menusHijos, usuario)) {
                        submenu.getElements().add(obj);
                    }
                    lo.add(submenu);
                }
            }
        }
        return lo;
    }
}
